package com.frcdi.qms.system.service.impl;

import cn.hutool.core.net.NetUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.frcdi.qms.system.domain.SysLicense;
import com.frcdi.qms.common.core.domain.AjaxResult;
import com.frcdi.qms.common.utils.DateUtils;
import com.frcdi.qms.common.utils.SecurityUtils;
import com.frcdi.qms.common.utils.ServletUtils;
import com.frcdi.qms.common.utils.StringUtils;
import com.frcdi.qms.common.utils.ip.IpUtils;
import com.frcdi.qms.common.utils.sign.Md5Utils;
import com.frcdi.qms.system.mapper.SysLicenseMapper;
import com.frcdi.qms.system.service.ISysConfigService;
import com.frcdi.qms.system.service.ISysLicenseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 授权信息Service业务层处理
 *
 * @author semarl
 * @date 2022-03-30
 */
@Service
public class SysLicenseServiceImpl implements ISysLicenseService {
    @Autowired
    private SysLicenseMapper sysLicenseMapper;
    @Autowired
    private ISysConfigService configService;

    private byte[] aesKey = "hubeishenmaruanjiankaifa".getBytes(CharsetUtil.CHARSET_UTF_8);

    /**
     * 查询授权信息
     *
     * @param id 授权信息主键
     * @return 授权信息
     */
    @Override
    public SysLicense selectSysLicenseById(Long id) {
        return sysLicenseMapper.selectSysLicenseById(id);
    }

    /**
     * 查询授权信息列表
     *
     * @param sysLicense 授权信息
     * @return 授权信息
     */
    @Override
    public List<SysLicense> selectSysLicenseList(SysLicense sysLicense) {
        return sysLicenseMapper.selectSysLicenseList(sysLicense);
    }


    /**
     * 修改授权信息
     *
     * @param sysLicense 授权信息
     * @return 结果
     */
    @Override
    public int updateSysLicense(SysLicense sysLicense) {
        sysLicense.setUpdateTime(DateUtils.getNowDate());
        return sysLicenseMapper.updateSysLicense(sysLicense);
    }

    /**
     * 批量删除授权信息
     *
     * @param ids 需要删除的授权信息主键
     * @return 结果
     */
    @Override
    public int deleteSysLicenseByIds(Long[] ids) {
        return sysLicenseMapper.deleteSysLicenseByIds(ids);
    }

    /**
     * 删除授权信息信息
     *
     * @param id 授权信息主键
     * @return 结果
     */
    @Override
    public int deleteSysLicenseById(Long id) {
        return sysLicenseMapper.deleteSysLicenseById(id);
    }

    /**
     * 新增授权信息
     *
     * @param sysLicense 授权信息
     * @return 结果
     */
    @Override
    public AjaxResult insertSysLicense(SysLicense sysLicense) {
        return submitLicense(sysLicense);
    }

    @Override
    public AjaxResult submitLicense(SysLicense sysLicense) {
        Date bindDate = DateUtil.parseDate(DateUtils.getDate());
        String userName = "";
        try {
            userName = SecurityUtils.getUsername();
        } catch (Exception e) {
        }
        try {
            //1.(本地验证)将授权码进行解密
            String decodeLicenseCode = SecureUtil.aes(aesKey).decryptStr(sysLicense.getCode(), CharsetUtil.CHARSET_UTF_8);
            //获取授权码信息
            String[] codeInfo = decodeLicenseCode.split("@@");
            String validDateStr = codeInfo[0];//授权日期
            String validNumStr = codeInfo[1];//授权人数
            String validMac = codeInfo[2];//授权的设备
            String mac = NetUtil.getLocalMacAddress();
            if (validMac.equals(mac)) {
                //
                Date validDate = DateUtil.parseDate(validDateStr);
                if (validDate.before(bindDate)) {
                    //授权已过期
                    //logClient.logAttributes("SysLicense", "", userName, "新增授权", "授权码：" + sysLicense.getCode(), "授权码：" + sysLicense.getCode() + "，该授权已过期，请联系管理员", "授权信息", null);
                    //授权已过期
                    return AjaxResult.error("该授权已过期，请联系管理员");
                }
                sysLicense.setValidDate(validDate);
                sysLicense.setNum(Long.valueOf(validNumStr));
                //授权成功，则向本地写入授权信息
                sysLicense.setPass(Md5Utils.hash(validDateStr + "@@" + validNumStr + "@@semarl.com"));
                sysLicense.setMac(mac);
                sysLicense.setIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
                //
                sysLicense.setCreateDate(bindDate);
                sysLicenseMapper.insertSysLicense(sysLicense);
                //2.(请求授权中心)更新授权信息
                try {
                    String verifyLicenseUrl = "https://j.semarl.com/rzLicense/system/license/checkLicense";
//                    configService.selectConfigByKey("verifyLicenseUrl");
                    Map<String, Object> submitParams = new HashMap<>();
                    submitParams.put("code", sysLicense.getCode());
                    submitParams.put("mac", sysLicense.getMac());
                    submitParams.put("ip", sysLicense.getIp());
                    String res = HttpUtil.post(verifyLicenseUrl, submitParams);
                    if (StringUtils.isNotEmpty(res)) {
                        JSONObject jsonObject = JSONUtil.parseObj(res);
                        int code = jsonObject.getInt("code");
                        if (code == 0) {
                            validDate = jsonObject.getDate("validDate");
                            if (validDate != null) {
                                if (validDate.before(bindDate)) {
                                    //授权已过期
                                    //logClient.logAttributes("SysLicense", "", userName, "新增授权", "授权码：" + sysLicense.getCode(), "授权码：" + sysLicense.getCode() + "，该授权已过期，请联系管理员", "授权信息", null);
                                    //授权已过期
                                    return AjaxResult.error("该授权已过期，请联系管理员");
                                }
                            }
                        }
                    }
                } catch (Exception e) {
                    //如果异常，则忽略
                }
                //logClient.logAttributes("SysLicense", "", userName, "新增授权", "授权码：" + sysLicense.getCode(), "授权成功", "授权信息", null);
                return AjaxResult.success("授权成功");
            } else {
                //logClient.logAttributes("SysLicense", "", userName, "新增授权", "授权码：" + sysLicense.getCode(), "授权码：" + sysLicense.getCode() + "，授权的设备不一致，请联系管理员", "授权信息", null);
                return AjaxResult.error("授权的设备不一致，请联系管理员");
            }
        } catch (Exception e) {
            //logClient.logAttributes("SysLicense", "", userName, "新增授权", "授权码：" + sysLicense.getCode(), "授权码：" + sysLicense.getCode() + "，无效的授权码", "授权信息", null);
            return AjaxResult.error("无效的授权码");
        }
    }

    @Override
    public AjaxResult verifyLicense() {
        //查询当前是否有授权记录
        List<SysLicense> licenseList = sysLicenseMapper.selectSysLicenseList(null);
        if (licenseList != null && licenseList.size() > 0) {
            //如果有授权记录，那么根据mac地址和code去授权服务器进行校验
            SysLicense sysLicense = licenseList.get(0);
            //得到数据库中的mac地址
            String dbMac = sysLicense.getMac();
            //得到当前的mac地址
            String mac = NetUtil.getLocalMacAddress();
            //如果两个地址不匹配，说明不是同一个授权的机器
            if (mac.equals(dbMac)) {
                //本地进行验证
                String pass = sysLicense.getPass();
                String validDateStr = DateUtil.format(sysLicense.getValidDate(), "yyyy-MM-dd");
                String validNumStr = String.valueOf(sysLicense.getNum());
                String checkPass = Md5Utils.hash(validDateStr + "@@" + validNumStr + "@@semarl.com");
                if (pass.equals(checkPass)) {//说明本地授权文件未篡改
                    //验证是否过期
                    if (sysLicense.getValidDate() != null) {
                        Date bindDate = DateUtil.parseDate(DateUtils.getDate());
                        Date validDate = sysLicense.getValidDate();
                        if (validDate.before(bindDate)) {
                            //授权已过期
                            return AjaxResult.error("该授权已过期，请联系管理员");
                        }
                    }
                    return AjaxResult.success("授权验证成功");
                } else {
                    return AjaxResult.error("授权信息被篡改，请重新输入授权码");
                }
            } else {
                return AjaxResult.error("授权的设备不一致，请联系管理员");
            }
        } else {
            return AjaxResult.error("请输入授权码");
        }
    }


}
